/**
 * @brief 模板方法模式
 * @version 1.0
 * @author 宋炜
*/

#pragma once
#include <type_traits>

template< typename TMPT_MTD , typename tmpt_t = typename std::remove_pointer< typename std::decay< TMPT_MTD > :: type > :: type >
class templateMethod : public tmpt_t
{
public:
	// 在方法类中必须要存在纯虚函数
	static_assert( std::is_abstract<tmpt_t>::value , "" );
public:
	templateMethod< tmpt_t > * operator->(){ return this; }
	templateMethod< tmpt_t >& operator*(){ return *this; }
};